Перейти к основному содержимому

5.07. Иерархия исключений в PHP

Разработчику Архитектору

Иерархия исключений в PHP

Корневой интерфейс:

  • Throwable — интерфейс, реализуемый всеми выбрасываемыми объектами.

Основные ветви:

  1. Exception — базовый класс для всех исключений, генерируемых пользовательским или библиотечным кодом.
  2. Error — базовый класс для ошибок времени выполнения, которые ранее приводили к фатальному завершению (например, вызов несуществующей функции).

Оба класса реализуют Throwable.


1. Встроенные классы, наследующие Exception

Эти исключения обычно выбрасываются явно или через стандартную библиотеку.

  • LogicException — логические ошибки, которые можно предотвратить при разработке:

    • BadFunctionCallException
      • BadMethodCallException
    • DomainException
    • InvalidArgumentException
    • LengthException
    • OutOfRangeException
  • RuntimeException — ошибки, возникающие во время выполнения:

    • OutOfBoundsException
    • OverflowException
    • RangeException
    • UnderflowException
    • UnexpectedValueException
  • PDOException — выбрасывается расширением PDO при ошибках базы данных.

  • ErrorException — используется для преобразования ошибок PHP (через set_error_handler) в исключения.


2. Встроенные классы, наследующие Error

Эти ошибки заменили многие фатальные ошибки PHP 5 и теперь могут быть перехвачены.

  • ArithmeticError
    • DivisionByZeroError
  • AssertionError
  • CompileError
  • ParseError
  • TypeError
  • ValueError (введён в PHP 8.0)
  • UninitializedPropertyError (введён в PHP 8.2, при доступе к непроинициализированному свойству)
  • FiberError (введён в PHP 8.1, при некорректном использовании Fiber)

3. Другие важные исключения из стандартной библиотеки

  • JsonException — выбрасывается функциями json_encode()/json_decode() при JSON_THROW_ON_ERROR.
  • DOMException — из расширения DOM.
  • ReflectionException — из расширения Reflection.
  • PharException — при работе с архивами Phar.
  • SoapFault — из расширения SOAP.

Эти исключения наследуются от Exception.


Особенности модели исключений в PHP:

  • Начиная с PHP 7, большинство фатальных ошибок (например, вызов несуществующей функции, несовпадение типов) выбрасывают экземпляры Error, а не завершают скрипт немедленно.
  • Error и Exception не наследуют друг друга, но оба реализуют Throwable. Поэтому для перехвата всех выбрасываемых объектов следует использовать:
    try {
    // ...
    } catch (Throwable $e) {
    // обработка и Error, и Exception
    }
  • Пользовательские исключения должны наследоваться от Exception (или одного из его подклассов), а не от Error.
  • Ошибки уровня E_ERROR, E_PARSE и т.д. больше не прерывают выполнение, если они преобразованы в Error (что происходит автоматически в PHP 7+).

Как получить список программно:

PHP не предоставляет встроенного способа перечислить все встроенные исключения, но можно использовать рефлексию:

$classes = get_declared_classes();
$exceptions = array_filter($classes, fn($c) => is_subclass_of($c, 'Throwable'));
sort($exceptions);
print_r($exceptions);

Этот код выведет все загруженные классы, реализующие Throwable.